package com.example.basic.demos.aop;

import com.example.basic.demos.annotation.SysLogAnnotation;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
public class SysLogAspect {
    @Pointcut("@annotation(com.example.basic.demos.annotation.SysLogAnnotation)")
    public void logPointCut() {
    }


    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {

        /**
         *
         Signature getSignature();	获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息
         Object[] getArgs();	获取传入目标方法的参数对象
         Object getTarget();	获取被代理的对象
         Object getThis();	获取代理对象
         */

        // [chenjiang, 25], 也就是类方法接收到的参数值
        Object[] args = joinPoint.getArgs();

        // 获取被代理的对象, 当前类
        // com.example.basic.demos.controller.IndexController@5d1970dc
        Object target = joinPoint.getTarget();

        // 获取类名
        // com.example.basic.demos.controller.IndexController
        String className = joinPoint.getTarget().getClass().getName();

        // 用来获取代理类和被代理类的信息。
        // CommonResult com.example.basic.demos.controller.IndexController.testAnnotation(String,Integer)
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();

        // 获取方法对象
        // public com.example.basic.demos.common.response.CommonResult com.example.basic.demos.controller.IndexController.testAnnotation()
        Method method = signature.getMethod();

        // 获取方法名
        // testAnnotation
        String methodName = signature.getName();


        // @com.example.basic.demos.annotation.SysLogAnnotation(value=陈江, desc=cxk)
        SysLogAnnotation sysLogAnnotation = method.getAnnotation(SysLogAnnotation.class);

        // 获取自定义注解上的值
        String value = sysLogAnnotation.value();
        String desc = sysLogAnnotation.desc();


        System.out.println("注解上的值：value-" + value + "; desc-" + desc);
        System.out.println("执行的类和方法：className-" + className + "; methodName-" + methodName);
        /**
         * 注解上的值：value-陈江; desc-cxk
         * 执行的类和方法：className-com.example.basic.demos.controller.IndexController; methodName-testAnnotation
         */


        // 获取类方法的返回结果
        Object proceed = joinPoint.proceed();

        return proceed;
    }
}
